home *** CD-ROM | disk | FTP | other *** search
- {
- W i n D r i v e r v 5 . 0 0
- ==============================
-
- Header file for Windows 95/98/ME/NT/NTE/NT2000.
- This file may not be distributed, it is only for evaluation & development purposes.
-
- Web site: http://www.jungo.com/windrv
- Email: support@jungo.com
-
- (C) Jungo 2001
- }
-
- unit WinDrvr;
- interface
- uses
- Windows, Dialogs, SysUtils;
-
- const
- WD_VER = 500;
- WD_VER_STR = 'WinDriver V5.00 Jungo (c) 2001';
-
- CMD_NONE = 0; { No command }
- CMD_END = 1; { End command }
-
- RP_BYTE = 10; { Read port byte }
- RP_WORD = 11; { Read port word }
- RP_DWORD = 12; { Read port dword }
- WP_BYTE = 13; { Write port byte }
- WP_WORD = 14; { Write port word }
- WP_DWORD = 15; { Write port dword }
-
- RP_SBYTE = 20; { Read port string byte }
- RP_SWORD = 21; { Read port string word }
- RP_SDWORD = 22; { Read port string dword }
- WP_SBYTE = 23; { Write port string byte }
- WP_SWORD = 24; { Write port string word }
- WP_SDWORD = 25; { Write port string dword }
-
- RM_BYTE = 30; { Read memory byte }
- RM_WORD = 31; { Read memory word }
- RM_DWORD = 32; { Read memory dword }
- WM_BYTE = 33; { Write memory byte }
- WM_WORD = 34; { Write memory word }
- WM_DWORD = 35; { Write memory dword }
-
- RM_SBYTE = 40; { Read memory string byte }
- RM_SWORD = 41; { Read memory string word }
- RM_SDWORD = 42; { Read memory string dword }
- WM_SBYTE = 43; { Write memory string byte }
- WM_SWORD = 44; { Write memory string word }
- WM_SDWORD = 45; { Write memory string dword }
-
-
- WD_DMA_PAGES = 256;
-
- DMA_KERNEL_BUFFER_ALLOC = 1; { the system allocates a contiguous buffer }
- { the user doesnt need to supply linear_address }
- DMA_KBUF_BELOW_16M = 2; { if DMA_KERNEL_BUFFER_ALLOC if used, }
- { this will make sure it is under 16M }
- DMA_LARGE_BUFFER = 4; { if DMA_LARGE_BUFFER if used, }
- { the maximum number of pages are dwPages, and not }
- { WD_DMA_PAGES. if you lock a user buffer (not a kernel }
- { allocated buffer) that is larger than 1MB, then use this }
- { option, and allocate memory for pages. }
-
- type
-
- PVOID = Pointer;
- HANDLE = THandle;
-
- WD_DMA_PAGE = record
- pPhysicalAddr: PVOID; { physical address of page }
- dwBytes: DWORD { size of page }
- end;
-
- WD_DMA = record
- hDMA: DWORD; { handle of DMA buffer }
- pUserAddr: PVOID; { beginning of buffer }
- dwBytes: DWORD; { size of buffer }
- dwOptions: DWORD; { allocation options: }
- dwPages: DWORD; { number of pages in buffer }
- Page: array [0 .. WD_DMA_PAGES - 1] of WD_DMA_PAGE
- end;
-
- SWD_TRANSFER = record { replaces WD_TRANSFER structure to avoid conflict }
- { with WD_Transfer() function }
- cmdTrans: DWORD; { Transfer command SWD_TRANSFER_CMD }
- dwPort: DWORD; { IO port for transfer or user memory address }
- dwBytes: DWORD; { For string transfer }
- fAutoInc: DWORD; { Transfer from one port/address or }
- { use incremental range of addresses }
- dwOptions: DWORD; { Must be 0 }
- case Integer of
- 0: (AByte: BYTE); { Byte transfer }
- 1: (AWord: WORD); { Word transfer }
- 2: (ADword: DWORD); { Dword transfer }
- 3: (pBuffer: PVOID) { String transfer }
- end;
- PWD_TRANSFER = ^ SWD_TRANSFER;
-
- const
- INTERRUPT_LEVEL_SENSITIVE = 1;
- INTERRUPT_CMD_COPY = 2;
-
- type
- WD_KERNEL_PLUGIN_CALL = record
- hKernelPlugIn: DWORD;
- dwMessage: DWORD;
- pData: PVOID;
- dwResult: DWORD
- end;
-
- WD_INTERRUPT = record
- hInterrupt: DWORD; { handle of interrupt }
- dwOptions: DWORD; { interrupt options: INTERRUPT_CMD_COPY }
- Cmd: PWD_TRANSFER; { commands to do on interrupt }
- dwCmds: DWORD; { number of commands for WD_IntEnable() }
- kpCall: WD_KERNEL_PLUGIN_CALL; { kernel plugin call }
- fEnableOk: DWORD; { did WD_IntEnable() succeed }
- { For WD_IntWait() and WD_IntCount() }
- dwCounter: DWORD; { number of interrupts received }
- dwLost: DWORD; { number of interrupts not yet dealt with }
- fStopped: DWORD { was interrupt disabled during wait }
- end;
-
- SWD_VERSION = record { replaces WD_VERSION structure to avoid conflict }
- { with WD_Version() function }
- dwVer: DWORD;
- cVer: array [0 .. 100-1] of CHAR { needs testing if pascal string is compatible }
- end;
-
- const
- LICENSE_DEMO=$1; LICENSE_WD=$4; LICENSE_KD=$400000;
- LICENSE_IO =$8; LICENSE_MEM =$10; LICENSE_INT =$20;
- LICENSE_PCI =$40; LICENSE_DMA =$80; LICENSE_NT =$100;
- LICENSE_95 =$200; LICENSE_ISAPNP=$400; LICENSE_PCMCIA=$800;
- LICENSE_PCI_DUMP=$1000; LICENSE_MSG_GEN=$2000; LICENSE_MSG_EDU=$4000;
- LICENSE_MSG_INT=$8000; LICENSE_KER_PLUG=$10000;
-
- LICENSE2_CPCI=$1;
-
- type
- SWD_LICENSE = record { replaces WD_LICENSE structure to avoid conflict }
- { with WD_License() function }
- cLicense: array [0 .. 100-1] of CHAR; { buffer with license string to }
- { put. If empty string then get }
- { current license setting into }
- { dwLicense }
- dwLicense: DWORD; { Returns license settings: }
- dwLicense2: DWORD { LICENSE_DEMO, LICENSE_WD etc... }
- { If put license was unsuccessful }
- { (i.e. invalid license) then dwLicense }
- { will return 0. }
- end;
-
- const
- ITEM_NONE=0; ITEM_INTERRUPT=1; ITEM_MEMORY=2; ITEM_IO=3; ITEM_BUS=5;
-
- type
- WD_ITEM_MEMORY = record
- dwPhysicalAddr: DWORD; { Physical address on card }
- dwMBytes: DWORD; { Address range }
- dwTransAddr: DWORD; { Returns the address to pass }
- { on to transfer commands }
- dwUserDirectAddr: DWORD; { Returns the address for}
- { direct user read/write }
- dwCpuPhysicalAddr: DWORD { returns the CPU physical address of card }
- end;
-
- WD_ITEM_IO = record
- dwAddr: DWORD; { Begining of IO address }
- dwBytes: DWORD { IO range }
- end;
-
- WD_ITEM_INTERRUPT = record
- dwInterrupt: DWORD; { Number of interrupt to }
- { install }
- dwOptions: DWORD; { Interrupt options: }
- { INTERRUPT_LEVEL_SENSITIVE }
- hInterrupt: DWORD { Returns the handle of the }
- { interrupt installed }
- end;
-
- WD_BUS = record
- dwBusType: DWORD; { Bus type: ISA, EISA, PCI, PCMCIA }
- dwBusNum: DWORD; { Bus number }
- dwSlotFunc: DWORD { Slot number on Bus }
- end;
-
- WD_ITEM_VALUE = record
- dw1: DWORD;
- dw2: DWORD;
- dw3: DWORD;
- dw4: DWORD;
- dw5: DWORD
- end;
-
- WD_ITEMS = record
- Item: DWORD { ITEM_TYPE };
- fNotSharable: DWORD;
- case Integer of
- 0 { ITEM_MEMORY }:
- (
- Memory: WD_ITEM_MEMORY
- );
- 1 { ITEM_IO }:
- (
- IO: WD_ITEM_IO
- );
- 2 { ITEM_INTERRUPT }:
- (
- Interrupt: WD_ITEM_INTERRUPT
- );
- 3 { ITEM_BUS }:
- (
- Bus: WD_BUS
- );
- 4 { ITEM_VALUE }:
- (
- Value: WD_ITEM_VALUE
- )
- end;
-
- PWD_ITEMS = ^WD_ITEMS;
-
- const
- WD_CARD_ITEMS = 20;
- type
- WD_CARD = record
- dwItems: DWORD;
- Item: array [0 .. WD_CARD_ITEMS - 1] of WD_ITEMS
- end;
-
- PWD_CARD = ^WD_CARD;
-
- WD_CARD_REGISTER = record
- Card: WD_CARD; { card to register }
- fCheckLockOnly: DWORD ; { only check if card is lockable, return hCard=1 if OK }
- hCard: DWORD; { handle of card }
- dwOptions: DWORD; { should be zero }
- cName: array[0 .. 32-1] of CHAR; { name of card }
- cDescription: array [0 .. 100-1] of CHAR { description }
- end;
-
- const
- WD_PCI_CARDS = 30;
-
- type
- WD_PCI_SLOT = record
- dwBus: DWORD;
- dwSlot: DWORD;
- dwFunction: DWORD
- end;
-
- PWD_PCI_SLOT = ^WD_PCI_SLOT;
-
- WD_PCI_ID = record
- dwVendorId: DWORD;
- dwDeviceId: DWORD
- end;
-
- WD_PCI_SCAN_CARDS = record
- searchId: WD_PCI_ID; { if dwVendorId = 0, scan all vendor Ids }
- { if dwDeviceId = 0, scan all device Ids }
- dwCards: DWORD; { Number of cards found }
- cardId: array [0 .. WD_PCI_CARDS - 1] of WD_PCI_ID;
- { VendorID & DeviceID of cards found }
- cardSlot: array [0 .. WD_PCI_CARDS - 1] of WD_PCI_SLOT
- { PCI slot info of cards found }
- end;
-
- WD_PCI_CARD_INFO = record
- pciSlot: WD_PCI_SLOT; { PCI slot }
- Card: WD_CARD { Get card parameters for PCI slot }
- end;
-
- const
- PCI_ACCESS_OK=0; PCI_ACCESS_ERROR=1; PCI_BAD_BUS=2; PCI_BAD_SLOT=3;
-
- type
- WD_PCI_CONFIG_DUMP = record
- pciSlot: WD_PCI_SLOT; { PCI bus, slot and function number }
- pBuffer: PVOID; { buffer for read/write }
- dwOffset: DWORD; { offset in pci configuration space }
- { to read/write from }
- dwBytes: DWORD; { bytes to read/write from/to buffer }
- { returns the # of bytes read/written }
- fIsRead: DWORD; { if 1 then read pci config, 0 write }
- { pci config }
- dwResult: DWORD { PCI_ACCESS_RESULT }
- end;
-
- const
- WD_ISAPNP_CARDS = 16 ;
-
- const
- WD_ISAPNP_COMPATIBLE_IDS = 10 ;
-
- const
- WD_ISAPNP_COMP_ID_LENGTH = 7 ; { ISA compressed ID is 7 chars long }
-
- const
- WD_ISAPNP_ANSI_LENGTH = 32 ; { ISA ANSI ID is limited to 32 chars long }
-
- type
- WD_ISAPNP_COMP_ID = array[0 .. WD_ISAPNP_COMP_ID_LENGTH] of CHAR;
- WD_ISAPNP_ANSI = array[0 .. WD_ISAPNP_ANSI_LENGTH+3] of CHAR; { add 3 bytes for DWORD alignment }
-
- WD_ISAPNP_CARD_ID = record
- cVendor: WD_ISAPNP_COMP_ID; { Vendor ID }
- dwSerial: DWORD { Serial number of card }
- end;
-
- WD_ISAPNP_CARD = record
- cardId: WD_ISAPNP_CARD_ID; { VendorID & serial number of cards found }
- dcLogicalDevices: DWORD; { Logical devices on the card }
- bPnPVersionMajor: BYTE; { ISA PnP version Major }
- bPnPVersionMinor: BYTE; { ISA PnP version Minor }
- bVendorVersionMajor: BYTE; { Vendor version Major }
- bVendorVersionMinor: BYTE; { Vendor version Minor }
- cIdent: WD_ISAPNP_ANSI ;{ Device identifier }
- end;
-
- WD_ISAPNP_SCAN_CARDS = record
- searchId: WD_ISAPNP_CARD_ID; { if searchId.cVendor[0]==0 - scan all vendor IDs
- if searchId.dwSerial==0 - scan all serial numbers }
- dwCards: DWORD; { number of cards found }
- Card: array[0 .. WD_ISAPNP_CARDS-1] of WD_ISAPNP_CARD { cards found }
- end;
-
-
- WD_ISAPNP_CARD_INFO = record
- cardId: WD_ISAPNP_CARD_ID; { VendorID and serial number of card }
- dwLogicalDevice: DWORD; { logical device in card }
- cLogicalDeviceId: WD_ISAPNP_COMP_ID; { logical device ID }
- dwCompatibleDevices: DWORD; { number of compatible device IDs }
- CompatibleDevice: array[0 .. WD_ISAPNP_COMPATIBLE_IDS-1] of WD_ISAPNP_COMP_ID; { Compatible device IDs }
- cIdent: WD_ISAPNP_ANSI; { Device identifier }
- Card: WD_CARD { get card parameters for the ISA PnP card }
- end;
-
- type
- WD_ISAPNP_CONFIG_DUMP = record
- cardId: WD_ISAPNP_CARD_ID; { VendorID and serial number of card }
- dwOffset: DWORD; { offset in ISA PnP configuration space to read/write from }
- fIsRead: DWORD; { if 1 then read ISA PnP config, 0 write ISA PnP config }
- bData: BYTE; { result data of byte read/write }
- dwResult: DWORD { ISAPNP_ACCESS_RESULT }
- end;
-
- const
- ISAPNP_ACCESS_OK = 0; ISAPNP_ACCESS_ERROR = 1; ISAPNP_BAD_ID = 2;
-
- { PCMCIA Card Services }
-
- const
- WD_PCMCIA_CARDS = 8;
-
- const
- WD_PCMCIA_VERSION_LEN = 4;
-
- const
- WD_PCMCIA_MANUFACTURER_LEN = 48;
-
- const
- WD_PCMCIA_PRODUCTNAME_LEN = 48;
-
- const
- WD_PCMCIA_MAX_SOCKET = 2;
-
- const
- WD_PCMCIA_MAX_FUNCTION = 2;
-
- type
- WD_PCMCIA_SLOT = record
- uSocket: BYTE; {Specifies the socket number (first socket is 0)}
- uFunction: BYTE; {Specifies the function number (first function is 0)}
- uPadding0: BYTE; {2 bytes padding so structure will be 4 bytes aligned}
- uPadding1: BYTE
- end;
-
- WD_PCMCIA_ID = record
- dwManufacturerId: DWORD; {card manufacturer}
- dwCardId: DWORD {card type and model}
- end;
-
- WD_PCMCIA_SCAN_CARDS = record
- searchId: WD_PCMCIA_ID; {device ID to search for}
- dwCards: DWORD; {number of cards found}
- cardId: array [0..WD_PCMCIA_CARDS-1] of WD_PCMCIA_ID; {device IDs of cards found}
- cardSlot: array [0..WD_PCMCIA_CARDS-1] of WD_PCMCIA_SLOT {pcmcia slot info of cards found}
- end;
-
- WD_PCMCIA_CARD_INFO = record
- pcmciaSlot: WD_PCMCIA_SLOT; {pcmcia slot}
- Card: WD_CARD; {get card parameters for pcmcia slot}
- cVersion: array [0..WD_PCMCIA_VERSION_LEN-1] of CHAR;
- cManufacturer: array [0..WD_PCMCIA_MANUFACTURER_LEN-1] of CHAR;
- cProductName: array [0..WD_PCMCIA_PRODUCTNAME_LEN-1] of CHAR;
- dwManufacturerId: DWORD; {card manufacturer}
- dwCardId: DWORD; {card type and model}
- dwFuncId: DWORD {card function code}
- end;
-
- WD_PCMCIA_CONFIG_DUMP = record
- pcmciaSlot: WD_PCMCIA_SLOT;
- pBuffer: PVOID; {buffer for read/write}
- dwOffset: DWORD; {offset in pcmcia configuration space to}
- {read/write from}
- dwBytes: DWORD; {bytes to read/write from/to buffer}
- {returns the number of bytes read/wrote}
- fIsRead: DWORD; {if 1 then read pci config, 0 write pci config}
- dwResult: DWORD {PCMCIA_ACCESS_RESULT}
- end;
-
- const
- SLEEP_NON_BUSY = 1;
-
- type
- SWD_SLEEP = record { replaces WD_SLEEP structure to avoid conflict }
- { with WD_Sleep() function }
- dwMicroSeconds: DWORD; { Sleep time in Micro Seconds (1/1,000,000 Second) }
- dwOptions: DWORD { can be:
- SLEEP_NON_BUSY this is accurate only for times above 10000 uSec }
- end;
-
- const
- D_OFF = 0; D_ERROR=1; D_WARN=2; D_INFO=3; D_TRACE=4;
-
- const
- S_ALL =$ffffffff;
- S_IO =$8; S_MEM =$10; S_INT=$20; S_PCI=$40; S_DMA=$80; S_MISC=$100; S_LICENSE=$200;
- S_ISAPNP=$400; S_PCMCIA=$800; S_KER_PLUG=$10000; S_CARD_REG=$2000;
-
- const
- DEBUG_STATUS = 1;
- DEBUG_SET_FILTER = 2;
- DEBUG_SET_BUFFER = 3;
- DEBUG_CLEAR_BUFFER = 4;
- DEBUG_DUMP_SEC_ON = 5;
- DEBUG_DUMP_SEC_OFF = 6;
-
- const
- METHOD_BUFFERED = 0;
- METHOD_IN_DIRECT = 1;
- METHOD_OUT_DIRECT = 2;
- METHOD_NEITHER = 3;
-
- const
- FILE_ANY_ACCESS = $0;
- FILE_READ_ACCESS = $1; { file & pipe }
- FILE_WRITE_ACCESS = $2; { file & pipe }
-
-
- type
-
- SWD_DEBUG = record { replaces WD_DEBUG structure to avoid conflict }
- { with WD_Debug() function }
- dwCmd: DWORD; { DEBUG_COMMAND: DEBUG_STATUS, DEBUG_SET_FILTER, DEBUG_SET_BUFFER, DEBUG_CLEAR_BUFFER
- used for DEBUG_SET_FILTER }
- dwLevel: DWORD; { DEBUG_LEVEL: D_ERROR, D_WARN..., or D_OFF to turn debugging off }
- dwSection: DWORD; { DEBUG_SECTION: for all sections in driver: S_ALL
- for partial sections: S_IO, S_MEM... }
- dwLevelMessageBox: DWORD; { DEBUG_LEVEL to print in a message box
- used for DEBUG_SET_BUFFER }
- dwBufferSize: DWORD { size of buffer in kernel }
- end;
-
- WD_DEBUG_DUMP = record
- pcBuffer: PCHAR; { buffer to receive debug messages }
- dwSize: DWORD { size of buffer in bytes }
- end;
-
- WD_KERNEL_PLUGIN = record
- hKernelPlugIn: DWORD;
- pcDriverName: PCHAR;
- pcDriverPath: PCHAR; { if NULL the driver will be searched in the windows system directory }
- pOpenData: PVOID
- end;
-
- { taken from usbdi.h }
- type USBD_PIPE_TYPE = DWORD;
- const
- UsbdPipeTypeControl = 0;
- UsbdPipeTypeIsochronous = 1;
- UsbdPipeTypeBulk = 2;
- UsbdPipeTypeInterrupt = 3;
-
- var { Pseudo constants }
- IOCTL_WD_USB_RESET_PIPE : INTEGER;
- IOCTL_WD_USB_RESET_DEVICE : INTEGER;
- IOCTL_WD_USB_SCAN_DEVICES : INTEGER;
- IOCTL_WD_USB_SCAN_DEVICES_V432 : INTEGER;
- IOCTL_WD_USB_TRANSFER : INTEGER;
- IOCTL_WD_USB_DEVICE_REGISTER : INTEGER;
- IOCTL_WD_USB_DEVICE_UNREGISTER : INTEGER;
- IOCTL_WD_USB_GET_CONFIGURATION : INTEGER;
-
- const
- WD_USB_MAX_PIPE_NUMBER = 32;
- WD_USB_MAX_ENDPOINTS = 32;
- WD_USB_MAX_INTERFACES = 30;
- WD_USB_MAX_DEVICE_NUMBER = 127;
-
- type
- WD_USB_ID = record
- dwVendorId : DWORD;
- dwProductId : DWORD;
- end;
-
- PWD_USB_ID = ^WD_USB_ID;
-
- type USB_DIR = DWORD;
- const
- UsbDirIn = 1;
- UsbDirOut = 2;
- UsbDirInOot = 3;
-
- type
- WD_USB_PIPE_INFO = record
- dwNumber : DWORD; {Pipe 0 is the default pipe}
- MaximumPacketSize : DWORD;
- PipeType : DWORD; { USBD_PIPE_TYPE }
- direction : DWORD; {USB_DIR
- Isochronous, Bulk, Interrupt are either USB_DIR_IN
- or USB_DIR_OUT Control are USB_DIR_IN_OUT}
- dwInterval : DWORD {interval in ms relevant to Interrupt pipes}
- end;
-
- PWD_USB_PIPE_INFO = ^WD_USB_PIPE_INFO;
-
- type
- WD_USB_CONFIG_DESC = record
- dwNumInterfaces : DWORD;
- dwValue : DWORD;
- dwAttributes : DWORD;
- MaxPower : DWORD;
- end;
-
- PWD_USB_CONFIG_DESC = ^WD_USB_CONFIG_DESC;
-
- type
- WD_USB_INTERFACE_DESC = record
- dwNumber : DWORD;
- dwAlternateSetting : DWORD;
- dwNumEndpoints : DWORD;
- dwClass : DWORD;
- dwSubClass : DWORD;
- dwProtocol : DWORD;
- dwIndex : DWORD;
- end;
-
- PWD_USB_INTERFACE_DESC = ^WD_USB_INTERFACE_DESC;
-
- type
- WD_USB_ENDPOINT_DESC = record
- dwEndpointAddress : DWORD;
- dwAttributes : DWORD;
- dwMaxPacketSize : DWORD;
- dwInterval : DWORD;
- end;
-
- PWD_USB_ENDPOINT_DESC = ^WD_USB_ENDPOINT_DESC;
-
- type
- WD_USB_INTERFACE = record
- InterfaceDesc : WD_USB_INTERFACE_DESC;
- Endpoints : array[0..WD_USB_MAX_ENDPOINTS-1] of WD_USB_ENDPOINT_DESC;
- end;
-
- PWD_USB_INTERFACE = ^WD_USB_INTERFACE;
-
- type
- WD_USB_CONFIGURATION = record
- uniqueId : DWORD;
- dwConfigurationIndex : DWORD;
- configuration : WD_USB_CONFIG_DESC;
- dwInterfaceAlternatives : DWORD;
- UsbInterface : array[0..WD_USB_MAX_INTERFACES-1] of WD_USB_INTERFACE;
- end;
-
- PWD_USB_CONFIGURATION = ^PWD_USB_CONFIGURATION;
-
- type
- WD_USB_HUB_GENERAL_INFO = record
- fBusPowered : DWORD;
- dwPorts : DWORD; {number of ports on this hub}
- dwCharacteristics : DWORD; {Hub Charateristics}
- dwPowerOnToPowerGood : DWORD; {port power on till power good in 2ms}
- dwHubControlCurrent : DWORD; {max current in mA}
- end;
-
- PWD_USB_HUB_GENERAL_INFO = ^WD_USB_HUB_GENERAL_INFO;
-
- type
- WD_USB_DEVICE_GENERAL_INFO = record
- deviceId : WD_USB_ID;
- dwHubNum : DWORD;
- dwPortNum : DWORD;
- fHub : DWORD;
- fFullSpeed : DWORD;
- dwConfigurationsNum : DWORD;
- deviceAddress : DWORD;
- hubInfo : WD_USB_HUB_GENERAL_INFO;
- end;
-
- PWD_USB_DEVICE_GENERAL_INFO = ^WD_USB_DEVICE_GENERAL_INFO;
-
- type
- WD_USB_DEVICE_INFO = record
- dwPipes : DWORD;
- Pipe : array[0..WD_USB_MAX_PIPE_NUMBER-1] of WD_USB_PIPE_INFO;
- end;
-
- PWD_USB_DEVICE_INFO = ^WD_USB_DEVICE_INFO;
-
- { IOCTL Structures }
- type
- WD_USB_SCAN_DEVICES = record
- searchId : WD_USB_ID; {if dwVendorId==0 - scan all vendor IDs
- if dwProductId==0 - scan all product IDs}
- dwDevices : DWORD;
- uniqueId : array[0..WD_USB_MAX_DEVICE_NUMBER-1] of DWORD; { a unique id to identify the device}
- deviceGeneralInfo : array[0..WD_USB_MAX_DEVICE_NUMBER] of WD_USB_DEVICE_GENERAL_INFO;
- end;
-
- PWD_USB_SCAN_DEVICES = ^WD_USB_SCAN_DEVICES;
-
- { USB TRANSFER options }
- const
- USB_TRANSFER_HALT = 1;
-
- type
- WD_USB_TRANSFER = record
- hDevice : DWORD; {handle of USB device to read from or write to}
- dwPipe : DWORD; {pipe number on device}
- fRead : BOOLEAN;
- dwOptions : DWORD; {USB_TRANSFER options:
- USB_TRANSFER_HALT halts the pervious transfer on the pipe}
- pBuffer : PVOID; {pointer to buffer to read/write}
- dwBytes : DWORD;
- dwTimeout : DWORD; {timeout for the transfer in milli-seconds. 0==>no timeout.}
- dwBytesTransfered : DWORD; {returns the number of bytes actually read/written}
- SetupPacket : array[0..7] of BYTE; {setup packet for control pipe transfer}
- fOK : DWORD;
- end;
-
- PWD_USB_TRANSFER = ^WD_USB_TRANSFER;
-
- type
- WD_USB_DEVICE_REGISTER = record
- uniqueId : DWORD; {the device unique ID}
- dwConfigurationIndex : DWORD; {the index of the configuration to register}
- dwInterfaceNum : DWORD; {interface to register}
- dwInterfaceAlternate : DWORD;
- hDevice : DWORD; {handle of device}
- Device : WD_USB_DEVICE_INFO; {description of the device}
- dwOptions : DWORD; {should be zero}
- cName : array[0..31] of CHAR ; {name of card}
- cDescription: array[0..99] of CHAR; {description}
- end;
-
- PWD_USB_DEVICE_REGISTER = ^WD_USB_DEVICE_REGISTER;
-
- type
- WD_USB_RESET_PIPE = record
- hDevice : DWORD;
- dwPipe : DWORD;
- end;
-
- PWD_USB_RESET_PIPE = ^WD_USB_RESET_PIPE;
-
- function WD_Open : HANDLE;
- procedure WD_Close(hWD: HANDLE);
- procedure WD_Debug(hWD: HANDLE;var Debug: SWD_DEBUG);
- procedure WD_DebugDump(hWD: HANDLE; var DebugDump: WD_DEBUG_DUMP);
- procedure WD_Transfer(hWD: HANDLE; var Transfer: SWD_TRANSFER);
- procedure WD_MultiTransfer(hWD: HANDLE; var TransferArray: array of SWD_TRANSFER);
- procedure WD_DMALock(hWD: HANDLE; var Dma: WD_DMA);
- procedure WD_DMAUnlock(hWD: HANDLE; var Dma: WD_DMA);
- procedure WD_IntEnable(hWD: HANDLE; var TheInterrupt: WD_INTERRUPT);
- procedure WD_IntDisable(hWD: HANDLE; var TheInterrupt: WD_INTERRUPT);
- procedure WD_IntCount(hWD: HANDLE; var TheInterrupt: WD_INTERRUPT);
- procedure WD_IntWait(hWD: HANDLE; var TheInterrupt: WD_INTERRUPT);
- procedure WD_IsapnpScanCards(hWD: HANDLE; var IsapnpScanCards: WD_ISAPNP_SCAN_CARDS);
- procedure WD_IsapnpGetCardInfo(hWD: HANDLE; var IsapnpGetCardInfo: WD_ISAPNP_CARD_INFO);
- procedure WD_IsapnpConfigDump(hWD: HANDLE; var IsapnpConfigDump: WD_ISAPNP_CONFIG_DUMP);
- procedure WD_PcmciaScanCards(hWD: HANDLE; var PcmciaScanCards: WD_PCMCIA_SCAN_CARDS);
- procedure WD_PcmciaGetCardInfo(hWD: HANDLE; var PcmciaGetCardInfo: WD_PCMCIA_CARD_INFO);
- procedure WD_PcmciaConfigDump(hWD: HANDLE; var PcmciaConfigDump: WD_PCMCIA_CONFIG_DUMP);
- procedure WD_Sleep(hWD: HANDLE; var Sleep: SWD_SLEEP);
- procedure WD_CardRegister(hWD: HANDLE; var Card: WD_CARD_REGISTER);
- procedure WD_CardUnregister(hWD: HANDLE; var Card: WD_CARD_REGISTER);
- procedure WD_PciScanCards(hWD: HANDLE; var PciScan: WD_PCI_SCAN_CARDS);
- procedure WD_PciGetCardInfo(hWD: HANDLE; var PciCard: WD_PCI_CARD_INFO);
- procedure WD_Version(hWD: HANDLE; var VerInfo: SWD_VERSION);
- procedure WD_License(hWD: HANDLE; var License: SWD_LICENSE);
- procedure WD_KernelPlugInOpen(hWD: HANDLE; var KernelPlugInOpen: WD_KERNEL_PLUGIN);
- procedure WD_KernelPlugInClose(hWD: HANDLE; var KernelPlugInClose: WD_KERNEL_PLUGIN);
- procedure WD_KernelPlugInCall(hWD: HANDLE; var KernelPlugInCall: WD_KERNEL_PLUGIN_CALL);
- procedure WD_PciConfigDump(hWD: HANDLE; var PciConfigDump: WD_PCI_CONFIG_DUMP);
- procedure WD_UsbScanDevice(h : HANDLE; pDeviceId : PWD_USB_ID);
- procedure WD_UsbGetConfiguration(h : HANDLE; pDeviceId : PWD_USB_ID);
- procedure WD_UsbDeviceRegister(h : HANDLE; pRegister : PWD_USB_DEVICE_REGISTER);
- procedure WD_UsbTransfer(h : HANDLE; pTrans : PWD_USB_TRANSFER);
- procedure WD_UsbDeviceUnregister(h : HANDLE; pTrans : PWD_USB_DEVICE_REGISTER);
- procedure WD_UsbResetPipe(h : HANDLE; pResetPipe : PWD_USB_RESET_PIPE);
- procedure WD_UsbResetDevice(h : HANDLE; hDevice : DWORD);
-
- var
- WinDriverGlobalDW: DWORD;
- { Pseudo constants }
- IOCTL_WD_DMA_LOCK: integer;
- IOCTL_WD_DMA_UNLOCK: integer;
- IOCTL_WD_TRANSFER: integer;
- IOCTL_WD_MULTI_TRANSFER: integer;
- IOCTL_WD_PCI_SCAN_CARDS: integer;
- IOCTL_WD_PCI_GET_CARD_INFO: integer;
- IOCTL_WD_VERSION: integer;
- IOCTL_WD_LICENSE: integer;
- IOCTL_WD_PCI_CONFIG_DUMP: integer;
- IOCTL_WD_KERNEL_PLUGIN_OPEN: integer;
- IOCTL_WD_KERNEL_PLUGIN_CLOSE: integer;
- IOCTL_WD_KERNEL_PLUGIN_CALL: integer;
- IOCTL_WD_INT_ENABLE: integer;
- IOCTL_WD_INT_DISABLE: integer;
- IOCTL_WD_INT_COUNT: integer;
- IOCTL_WD_INT_WAIT: integer;
- IOCTL_WD_ISAPNP_SCAN_CARDS: integer;
- IOCTL_WD_ISAPNP_GET_CARD_INFO: integer;
- IOCTL_WD_ISAPNP_CONFIG_DUMP: integer;
- IOCTL_WD_SLEEP: integer;
- IOCTL_WD_DEBUG: integer;
- IOCTL_WD_DEBUG_DUMP: integer;
- IOCTL_WD_CARD_UNREGISTER: integer;
- IOCTL_WD_CARD_REGISTER: integer;
- IOCTL_WD_PCMCIA_SCAN_CARDS: integer;
- IOCTL_WD_PCMCIA_GET_CARD_INFO: integer;
- IOCTL_WD_PCMCIA_CONFIG_DUMP: integer;
-
-
- function Get_Ctl_Code(Nr: Integer): Integer;
-
- implementation
- const
- WD_TYPE = 38200;
-
- {This is an implementation of a WinIOCTL macro (CTL_CODE) }
- function Get_Ctl_Code(Nr: Integer): Integer;
- begin
- Result:= (WD_TYPE shl 16) or (FILE_ANY_ACCESS shl 14) or (Nr shl 2) or
- METHOD_NEITHER
- end;
-
- function WD_Open: HANDLE;
- begin
- WD_Open := CreateFile(PChar('\\.\WINDRVR'), GENERIC_READ,
- FILE_SHARE_READ or FILE_SHARE_WRITE,
- nil, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
- end;
-
- procedure WD_Close(hWD: HANDLE);
- begin
- CloseHandle(hWD);
- end ;
-
- procedure WD_Debug(hWD: HANDLE ;var Debug: SWD_DEBUG);
- begin
- DeviceIOControl(hWD, IOCTL_WD_DEBUG, @Debug,
- SizeOf(SWD_DEBUG), nil, 0, WinDriverGlobalDW, nil)
- end;
-
- procedure WD_DebugDump(hWD: HANDLE ;var DebugDump: WD_DEBUG_DUMP);
- begin
- DeviceIOControl(hWD, IOCTL_WD_DEBUG_DUMP, @DebugDump,
- SizeOf(WD_DEBUG_DUMP), nil, 0, WinDriverGlobalDW, nil)
- end;
-
- procedure WD_Transfer(hWD: HANDLE ;var Transfer: SWD_TRANSFER);
- begin
- DeviceIOControl(hWD, IOCTL_WD_TRANSFER, @Transfer,
- SizeOf(SWD_TRANSFER), nil, 0, WinDriverGlobalDW, nil)
- end;
-
- procedure WD_MultiTransfer(hWD: HANDLE ; var TransferArray: array of SWD_TRANSFER);
- begin
- DeviceIOControl(hWD, IOCTL_WD_MULTI_TRANSFER, @TransferArray,
- SizeOf(SWD_TRANSFER) * (High(TransferArray) + 1), nil,
- 0, WinDriverGlobalDW, nil)
- end;
-
- procedure WD_DMALock(hWD: HANDLE ;var Dma: WD_DMA);
- begin
- DeviceIOControl(hWD, IOCTL_WD_DMA_LOCK, @Dma, SizeOf(WD_DMA), nil, 0,
- WinDriverGlobalDW, nil)
- end;
-
- procedure WD_DMAUnlock(hWD: HANDLE ;var Dma: WD_DMA);
- begin
- DeviceIOControl(hWD, IOCTL_WD_DMA_UNLOCK, @Dma, SizeOf(WD_DMA), nil,
- 0, WinDriverGlobalDW, nil)
- end;
-
- procedure WD_IntEnable(hWD: HANDLE ;var TheInterrupt: WD_INTERRUPT);
- begin
- DeviceIOControl(hWD, IOCTL_WD_INT_ENABLE, @TheInterrupt,
- SizeOf(WD_INTERRUPT), nil, 0, WinDriverGlobalDW, nil)
- end;
-
- procedure WD_IntDisable(hWD: HANDLE ;var TheInterrupt: WD_INTERRUPT);
- begin
- DeviceIOControl(hWD, IOCTL_WD_INT_DISABLE, @TheInterrupt,
- SizeOf(WD_INTERRUPT), nil, 0, WinDriverGlobalDW, nil)
- end;
-
- procedure WD_IntCount(hWD: HANDLE ;var TheInterrupt: WD_INTERRUPT);
- begin
- DeviceIOControl(hWD, IOCTL_WD_INT_COUNT, @TheInterrupt,
- SizeOf(WD_INTERRUPT), nil, 0, WinDriverGlobalDW, nil)
- end;
-
- procedure WD_IntWait(hWD: HANDLE ;var TheInterrupt: WD_INTERRUPT);
- var
- h: HANDLE;
- begin
- h:=WD_Open();
- DeviceIOControl(h, IOCTL_WD_INT_WAIT, @TheInterrupt,
- SizeOf(WD_INTERRUPT), nil, 0, WinDriverGlobalDW, nil);
- WD_Close(h);
- end;
-
- procedure WD_IsapnpScanCards(hWD: HANDLE ;var IsapnpScanCards: WD_ISAPNP_SCAN_CARDS);
- begin
- DeviceIOControl(hWD, IOCTL_WD_ISAPNP_SCAN_CARDS, @IsapnpScanCards,
- SizeOf(WD_ISAPNP_SCAN_CARDS), nil, 0, WinDriverGlobalDW, nil)
- end;
-
- procedure WD_IsapnpGetCardInfo(hWD: HANDLE ;var IsapnpGetCardInfo: WD_ISAPNP_CARD_INFO);
- begin
- DeviceIOControl(hWD, IOCTL_WD_ISAPNP_GET_CARD_INFO, @IsapnpGetCardInfo,
- SizeOf(WD_ISAPNP_CARD_INFO), nil, 0, WinDriverGlobalDW, nil)
- end;
-
- procedure WD_IsapnpConfigDump(hWD: HANDLE ;var IsapnpConfigDump: WD_ISAPNP_CONFIG_DUMP);
- begin
- DeviceIOControl(hWD, IOCTL_WD_ISAPNP_CONFIG_DUMP, @IsapnpConfigDump,
- SizeOf(WD_ISAPNP_CONFIG_DUMP), nil, 0, WinDriverGlobalDW, nil)
- end;
-
- procedure WD_PcmciaScanCards(hWD: HANDLE ;var PcmciaScanCards: WD_PCMCIA_SCAN_CARDS);
- begin
- DeviceIOControl(hWD, IOCTL_WD_PCMCIA_SCAN_CARDS, @PcmciaScanCards,
- SizeOf(WD_PCMCIA_SCAN_CARDS), nil, 0, WinDriverGlobalDW, nil)
- end;
-
- procedure WD_PcmciaGetCardInfo(hWD: HANDLE ;var PcmciaGetCardInfo: WD_PCMCIA_CARD_INFO);
- begin
- DeviceIOControl(hWD, IOCTL_WD_PCMCIA_GET_CARD_INFO, @PcmciaGetCardInfo,
- SizeOf(WD_PCMCIA_CARD_INFO), nil, 0, WinDriverGlobalDW, nil)
- end;
-
- procedure WD_PcmciaConfigDump(hWD: HANDLE ;var PcmciaConfigDump: WD_PCMCIA_CONFIG_DUMP);
- begin
- DeviceIOControl(hWD, IOCTL_WD_PCMCIA_CONFIG_DUMP, @PcmciaConfigDump,
- SizeOf(WD_PCMCIA_CONFIG_DUMP), nil, 0, WinDriverGlobalDW, nil)
- end;
-
- procedure WD_Sleep(hWD: HANDLE ;var Sleep: SWD_SLEEP);
- begin
- DeviceIOControl(hWD, IOCTL_WD_SLEEP, @Sleep,
- SizeOf(SWD_SLEEP), nil, 0, WinDriverGlobalDW, nil)
- end;
-
- procedure WD_CardRegister(hWD: HANDLE ;var Card: WD_CARD_REGISTER);
- begin
- DeviceIOControl(hWD, IOCTL_WD_CARD_REGISTER, @Card,
- SizeOf(WD_CARD_REGISTER), nil, 0, WinDriverGlobalDW, nil)
- end;
-
- procedure WD_CardUnregister(hWD: HANDLE ;var Card: WD_CARD_REGISTER);
- begin
- DeviceIOControl(hWD, IOCTL_WD_CARD_UNREGISTER, @Card,
- SizeOf(WD_CARD_REGISTER), nil, 0, WinDriverGlobalDW, nil)
- end;
-
- procedure WD_PciScanCards(hWD: HANDLE ;var PciScan: WD_PCI_SCAN_CARDS);
- begin
- DeviceIOControl(hWD, IOCTL_WD_PCI_SCAN_CARDS, @PciScan,
- SizeOf(WD_PCI_SCAN_CARDS), nil, 0, WinDriverGlobalDW, nil)
- end;
-
- procedure WD_PciGetCardInfo(hWD: HANDLE ;var PciCard: WD_PCI_CARD_INFO);
- begin
- DeviceIOControl(hWD, IOCTL_WD_PCI_GET_CARD_INFO, @PciCard,
- SizeOf(WD_PCI_CARD_INFO), nil, 0, WinDriverGlobalDW, nil)
- end;
-
- procedure WD_Version(hWD: HANDLE ;var VerInfo: SWD_VERSION);
- begin
- DeviceIOControl(hWD, IOCTL_WD_VERSION, @VerInfo, SizeOf(SWD_VERSION),
- nil, 0, WinDriverGlobalDW, nil)
- end;
-
- procedure WD_License(hWD: HANDLE ;var License: SWD_LICENSE);
- begin
- DeviceIOControl(hWD, IOCTL_WD_LICENSE, @License, SizeOf(SWD_LICENSE),
- nil, 0, WinDriverGlobalDW, nil)
- end;
-
- procedure WD_KernelPlugInOpen(hWD: HANDLE ;var KernelPlugInOpen: WD_KERNEL_PLUGIN);
- begin
- DeviceIOControl(hWD, IOCTL_WD_KERNEL_PLUGIN_OPEN, @KernelPlugInOpen, SizeOf(WD_KERNEL_PLUGIN),
- nil, 0, WinDriverGlobalDW, nil)
- end;
-
- procedure WD_KernelPlugInClose(hWD: HANDLE ;var KernelPlugInClose: WD_KERNEL_PLUGIN);
- begin
- DeviceIOControl(hWD, IOCTL_WD_KERNEL_PLUGIN_CLOSE, @KernelPlugInClose, SizeOf(WD_KERNEL_PLUGIN),
- nil, 0, WinDriverGlobalDW, nil)
- end;
-
- procedure WD_KernelPlugInCall(hWD: HANDLE ;var KernelPlugInCall: WD_KERNEL_PLUGIN_CALL);
- begin
- DeviceIOControl(hWD, IOCTL_WD_KERNEL_PLUGIN_CALL, @KernelPlugInCall, SizeOf(WD_KERNEL_PLUGIN_CALL),
- nil, 0, WinDriverGlobalDW, nil)
- end;
-
- procedure WD_PciConfigDump(hWD: HANDLE ;var PciConfigDump: WD_PCI_CONFIG_DUMP);
- begin
- DeviceIOControl(hWD, IOCTL_WD_PCI_CONFIG_DUMP, @PciConfigDump,
- SizeOf(WD_PCI_CONFIG_DUMP), nil, 0, WinDriverGlobalDW, nil)
- end;
-
- procedure WD_FUNCTION(wFuncNum : DWORD; h : HANDLE; pParam : POINTER; dwSize : DWORD);
- begin
- DeviceIoControl(h, wFuncNum, pParam, dwSize, nil, 0, WinDriverGlobalDW, nil);
- end;
-
-
- procedure WD_UsbScanDevice(h : HANDLE; pDeviceId : PWD_USB_ID);
- begin
- WD_FUNCTION(IOCTL_WD_USB_SCAN_DEVICES, h, POINTER(pDeviceId), DWORD(SizeOf(WD_USB_SCAN_DEVICES)));
- end;
-
-
- procedure WD_UsbGetConfiguration(h : HANDLE; pDeviceId : PWD_USB_ID);
- begin
- WD_FUNCTION(IOCTL_WD_USB_GET_CONFIGURATION, h, POINTER(pDeviceId), DWORD(SizeOf(WD_USB_CONFIGURATION)));
- end;
-
-
- procedure WD_UsbDeviceRegister(h : HANDLE; pRegister : PWD_USB_DEVICE_REGISTER);
- begin
- WD_FUNCTION(IOCTL_WD_USB_DEVICE_REGISTER, h, pRegister, DWORD(sizeof(WD_USB_DEVICE_REGISTER)));
- end;
-
-
- procedure WD_UsbTransfer(h : HANDLE; pTrans : PWD_USB_TRANSFER);
- var
- lh: HANDLE;
- begin
- lh:=WD_Open();
- WD_FUNCTION(IOCTL_WD_USB_TRANSFER, lh, POINTER(pTrans), DWORD(SizeOf(WD_USB_TRANSFER)));
- WD_Close(lh);
- end;
-
-
- procedure WD_UsbDeviceUnregister(h : HANDLE; pTrans : PWD_USB_DEVICE_REGISTER);
- begin
- WD_FUNCTION(IOCTL_WD_USB_DEVICE_UNREGISTER, h, POINTER(pTrans), DWORD(SizeOf(WD_USB_DEVICE_REGISTER)));
- end;
-
-
- procedure WD_UsbResetPipe(h : HANDLE; pResetPipe : PWD_USB_RESET_PIPE);
- begin
- WD_FUNCTION(IOCTL_WD_USB_RESET_PIPE, h, POINTER(pResetPipe), DWORD(SizeOf(WD_USB_RESET_PIPE)));
- end;
-
-
- procedure WD_UsbResetDevice(h : HANDLE; hDevice : DWORD);
- begin
- WD_FUNCTION(IOCTL_WD_USB_RESET_DEVICE, h, @hDevice, DWORD(SizeOf(DWORD)));
- end;
-
- initialization
- IOCTL_WD_DMA_LOCK := Get_Ctl_Code($901) ;
- IOCTL_WD_DMA_UNLOCK := Get_Ctl_Code($902) ;
- IOCTL_WD_TRANSFER := Get_Ctl_Code($903) ;
- IOCTL_WD_MULTI_TRANSFER := Get_Ctl_Code($904) ;
- IOCTL_WD_PCI_SCAN_CARDS := Get_Ctl_Code($90e) ;
- IOCTL_WD_PCI_GET_CARD_INFO := Get_Ctl_Code($90f) ;
- IOCTL_WD_VERSION := Get_Ctl_Code($910) ;
- IOCTL_WD_PCI_CONFIG_DUMP := Get_Ctl_Code($91a) ;
- IOCTL_WD_KERNEL_PLUGIN_OPEN := Get_Ctl_Code($91b) ;
- IOCTL_WD_KERNEL_PLUGIN_CLOSE := Get_Ctl_Code($91c) ;
- IOCTL_WD_KERNEL_PLUGIN_CALL := Get_Ctl_Code($91d) ;
- IOCTL_WD_INT_ENABLE := Get_Ctl_Code($91e) ;
- IOCTL_WD_INT_DISABLE := Get_Ctl_Code($91f) ;
- IOCTL_WD_INT_COUNT := Get_Ctl_Code($920) ;
- IOCTL_WD_ISAPNP_SCAN_CARDS := Get_Ctl_Code($924) ;
- IOCTL_WD_ISAPNP_CONFIG_DUMP := Get_Ctl_Code($926) ;
- IOCTL_WD_SLEEP := Get_Ctl_Code($927) ;
- IOCTL_WD_DEBUG := Get_Ctl_Code($928) ;
- IOCTL_WD_DEBUG_DUMP := Get_Ctl_Code($929) ;
- IOCTL_WD_CARD_UNREGISTER := Get_Ctl_Code($92b) ;
- IOCTL_WD_ISAPNP_GET_CARD_INFO := Get_Ctl_Code($92d) ;
- IOCTL_WD_PCMCIA_SCAN_CARDS := Get_Ctl_Code($92f) ;
- IOCTL_WD_PCMCIA_GET_CARD_INFO := Get_Ctl_Code($930) ;
- IOCTL_WD_PCMCIA_CONFIG_DUMP := Get_Ctl_Code($931) ;
- IOCTL_WD_CARD_REGISTER := Get_Ctl_Code($956) ;
- IOCTL_WD_INT_WAIT := Get_Ctl_Code($94b) ;
- IOCTL_WD_LICENSE := Get_Ctl_Code($952) ;
- IOCTL_WD_USB_RESET_PIPE := Get_Ctl_Code($93c) ;
- IOCTL_WD_USB_RESET_DEVICE := Get_Ctl_Code($93f) ;
- IOCTL_WD_USB_SCAN_DEVICES_V432 := Get_Ctl_Code($940) ;
- IOCTL_WD_USB_SCAN_DEVICES := Get_Ctl_Code($95a) ;
- IOCTL_WD_USB_TRANSFER := Get_Ctl_Code($942) ;
- IOCTL_WD_USB_DEVICE_REGISTER := Get_Ctl_Code($949) ;
- IOCTL_WD_USB_DEVICE_UNREGISTER := Get_Ctl_Code($959) ;
- IOCTL_WD_USB_GET_CONFIGURATION := Get_Ctl_Code($946) ;
-
- end.
-
-